from flask import Flask
import os
import logging
from logging.handlers import RotatingFileHandler
from app.extensions import db, cors
from app.routes import api_bp
from app.models import User, Video, Category, Like, Favorite, Comment

def create_app():
    """
    创建Flask应用实例
    
    Returns:
        Flask: 配置好的Flask应用实例
    """
    # 创建Flask应用
    app = Flask(__name__)
    
    # 配置应用
    configure_app(app)
    
    # 初始化扩展
    initialize_extensions(app)
    
    # 注册蓝图
    register_blueprints(app)
    
    # 配置日志
    configure_logging(app)
    
    # 创建数据库表
    with app.app_context():
        db.create_all()
    
    return app

def configure_app(app):
    """
    配置Flask应用
    
    Args:
        app: Flask应用实例
    """
    # 首先从.env文件加载环境变量（如果存在）
    if os.path.exists('.env'):
        try:
            with open('.env', 'r', encoding='utf-8') as f:
                for line in f:
                    if line.strip() and not line.startswith('#'):
                        key, value = line.strip().split('=', 1)
                        os.environ[key] = value
            print("已从.env文件加载环境变量")
        except Exception as e:
            print(f"警告: 无法加载.env文件: {e}")
    
    # 从环境变量获取配置
    app.config['SECRET_KEY'] = os.environ.get('SECRET_KEY', 'dev_secret_key_change_in_production')
    
    # 尝试从环境变量获取数据库连接信息，如果没有则使用默认值
    # 支持从本地或Docker环境连接
    app.config['SQLALCHEMY_DATABASE_URI'] = os.environ.get('DATABASE_URL', 'mysql+pymysql://root:myfuture@localhost:3306/zjs_bilibili?charset=utf8mb4')
    app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
    
    # JWT配置
    app.config['JWT_SECRET_KEY'] = os.environ.get('JWT_SECRET_KEY', 'dev_jwt_secret_key_change_in_production')
    app.config['JWT_EXPIRATION_DELTA'] = int(os.environ.get('JWT_EXPIRATION_DELTA', '3600'))
    
    # 打印配置信息（包含数据库地址，便于调试）
    app.logger.info(f"数据库连接地址: {app.config['SQLALCHEMY_DATABASE_URI']}")
    
    # 打印配置信息（不包含敏感信息）
    app.logger.info(f"应用配置完成，环境: {os.environ.get('FLASK_ENV', 'development')}")
    db_host = app.config['SQLALCHEMY_DATABASE_URI'].split('@')[1].split(':')[0] if '@' in app.config['SQLALCHEMY_DATABASE_URI'] else 'localhost'
    app.logger.info(f"数据库连接主机: {db_host}")

def initialize_extensions(app):
    """
    初始化Flask扩展
    
    Args:
        app: Flask应用实例
    """
    # 初始化数据库
    db.init_app(app)
    
    # 初始化CORS
    cors.init_app(app, resources={r"/api/*": {"origins": "*"}})

def register_blueprints(app):
    """
    注册Flask蓝图
    
    Args:
        app: Flask应用实例
    """
    # 注册API蓝图
    app.register_blueprint(api_bp)

def configure_logging(app):
    """
    配置应用日志
    
    Args:
        app: Flask应用实例
    """
    # 创建日志目录
    if not os.path.exists('logs'):
        os.mkdir('logs')
    
    # 设置日志记录器
    file_handler = RotatingFileHandler(
        'logs/app.log',
        maxBytes=10240,
        backupCount=10,
        encoding='utf-8'
    )
    
    # 设置日志格式
    file_handler.setFormatter(logging.Formatter(
        '%(asctime)s %(levelname)s: %(message)s [in %(pathname)s:%(lineno)d]'
    ))
    
    # 设置日志级别
    file_handler.setLevel(logging.INFO)
    app.logger.addHandler(file_handler)
    
    # 设置控制台日志
    console_handler = logging.StreamHandler()
    console_handler.setLevel(logging.INFO)
    console_handler.setFormatter(logging.Formatter(
        '%(asctime)s %(levelname)s: %(message)s'
    ))
    app.logger.addHandler(console_handler)
    
    # 设置默认日志级别
    app.logger.setLevel(logging.INFO)
    app.logger.info('应用启动')

if __name__ == '__main__':
    # 创建应用
    app = create_app()
    
    # 运行应用
    host = os.environ.get('HOST', '0.0.0.0')
    port = int(os.environ.get('PORT', 5000))
    debug = os.environ.get('FLASK_ENV') == 'development'
    
    app.logger.info(f'服务运行在 {host}:{port}')
    app.run(host=host, port=port, debug=debug)